package com.insight.modules.system.rule;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yuanqiao.insight.acore.depart.entity.SysDepart;
import io.netty.util.internal.StringUtil;
import com.insight.common.handler.IFillRuleHandler;
import com.insight.common.util.SpringContextUtils;
import com.insight.common.util.YouBianCodeUtil;
import com.insight.modules.system.service.ISysDepartService;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author scott
 * @Date 2019/12/9 11:33
 * @Description: 机构编码生成规则
 */
public class OrgCodeRule implements IFillRuleHandler {

    /**
     * 根据父级部门信息，生成新的部门编码和部门类型
     *
     * @param params   规则参数，可能包含parentId（父部门ID）
     * @param formData 动态表单数据，也可能包含parentId
     * @return String数组，第一个元素是新生成的部门编码，第二个元素是部门类型
     */
    @Override
    public Object execute(JSONObject params, JSONObject formData) {
        // 从Spring容器中获取部门服务Bean
        ISysDepartService sysDepartService = (ISysDepartService) SpringContextUtils.getBean("sysDepartServiceImpl");

        // 定义查询条件包装器
        LambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<>();
        LambdaQueryWrapper<SysDepart> query1 = new LambdaQueryWrapper<>();

        // 用于存放查询结果的部门集合
        List<SysDepart> departList = new ArrayList<>();

        // 返回结果数组：0 -> 新编码，1 -> 部门类型
        String[] strArray = new String[2];

        // 定义部门类型变量
        String orgType = "";

        // 新编码和旧编码变量
        String newOrgCode = "";
        String oldOrgCode = "";

        // 解析传入的parentId（父部门ID）
        String parentId = null;
        if (formData != null && formData.size() > 0) {
            Object obj = formData.get("parentId");
            if (obj != null) parentId = obj.toString();
        } else if (params != null) {
            Object obj = params.get("parentId");
            if (obj != null) parentId = obj.toString();
        }

        // 如果parentId为空，说明是最高级部门（无父级）
        if (StringUtil.isNullOrEmpty(parentId)) {
            // 查询所有一级部门（父ID为空或空字符串），按编码降序排序，取出列表
            query1.eq(SysDepart::getParentId, "").or().isNull(SysDepart::getParentId);
            query1.orderByDesc(SysDepart::getOrgCode);
            departList = sysDepartService.list(query1);

            // 如果一级部门为空，说明数据库无数据，直接生成初始编码
            if (departList == null || departList.size() == 0) {
                strArray[0] = YouBianCodeUtil.getNextYouBianCode(null);
                strArray[1] = "1"; // 默认部门类型为1
                return strArray;
            } else {
                // 取出编码最大的一级部门，获取旧编码和部门类型
                SysDepart depart = departList.get(0);
                oldOrgCode = depart.getOrgCode();
                orgType = depart.getOrgType();
                // 生成新的同级部门编码
                newOrgCode = YouBianCodeUtil.getNextYouBianCode(oldOrgCode);
            }
        } else {
            // 有父级部门ID，查询所有同级部门（即parentId相同的部门），按编码降序排序
            query.eq(SysDepart::getParentId, parentId);
            query.orderByDesc(SysDepart::getOrgCode);
            List<SysDepart> parentList = sysDepartService.list(query);

            // 获取父部门实体及其编码
            SysDepart depart = sysDepartService.getById(parentId);
            String parentCode = depart.getOrgCode();

            // 计算当前部门的部门类型：父部门类型 + 1
            orgType = String.valueOf(Integer.valueOf(depart.getOrgType()) + 1);

            // 如果同级部门为空，说明当前是第一个子部门，直接生成子编码
            if (parentList == null || parentList.size() == 0) {
                newOrgCode = YouBianCodeUtil.getSubYouBianCode(parentCode, null);
            } else {
                // 如果有同级部门，取编码最大的同级部门编码，生成下一个编码
                String subCode = parentList.get(0).getOrgCode();
                newOrgCode = YouBianCodeUtil.getSubYouBianCode(parentCode, subCode);
            }
        }

        // 封装新编码和部门类型，作为结果返回
        strArray[0] = newOrgCode;
        strArray[1] = orgType;
        return strArray;
    }
}

